module.exports = app => {
  return async function errorHandler(ctx, next) {
    try {
      await next()
      // 提交事务
      if (ctx.getTran()) {
        await ctx.getTran().commit()
      }
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx)
      const status = err.status || '500'
      ctx.renderBack(null, '0', null, status, err.message)
      // 事务回滚
      if (ctx.getTran()) {
        await ctx.getTran().rollback()
      }
    }
  }
}
